Параметры

Правила использования параметров

  • Параметры по умолчанию должны точно определяться на этапе компиляции, а значит в них можно использовать только примитивы, Null или для значимых типов зануленные значения через ключевое слово default. Пример:
static void Method(Point p = default)
{
    
}

Ключевое слово default разрешает разрабу пользоваться переменной без явной инициализации, таким образом, если тип значимый, то все поля с 0, а если ссылочный то вся переменная null.

Передача по ссылке

  • Для параметров с ключевыми словами out in ref нельзя задать значение по умолчанию.
  • CLR не поддерживает отдельно ref и out. После компиляции эти ключевые слова становятся одной и той же командой.
  • CLR поддерживает перегрузку методов, где сигнатура отличается наличием ref или out у одного из параметров. Однако, т.к. ref и out превратятся в одну команду, нельзя перегрузить один метод с ref, а другой с out.
    Ключевые слова ref in out полезны с точки зрения оптимизации кода, например можно не перекопировать всю структуру, если переменная значимого типа. Также они полезны если ииз метода ребуется вернуть больше одного значения.

Переменное количество аргументов

В C# можно передать неопределенное число аргументов одного типа

static int Add(params int[] values){
 ...
}

Add(1, 2, 5, 6)

При передаче переменного количества аргументов фактически генеррируется код инициализации массива и передаче массива.

Данная функция не рекомендуется к частому использованию поскольку она требует инициализации массива перед вызовом функции, это трата времени и памяти.
По этой причине стоит сделать несолько перегрузок которые будут поддерживать например 1-3 параметра, а потом уже писать перегрузку с params.

Типы возвращаемых и передаваемых значений

Хорошей практикой считается принимать наиболее общий, слабый тип, так, считается что лучше принимать параметром IEnumerable чем List. При этом считается хорошей практикой возвращать наиболее сильный тип (Но тоже нельзя перебарщивать). Так, лучше вернуть IList чем просто IEnumerable, чтобы те кто будут вызывать делали наименьшее число преобразований типов.